package com.boss.salary.api;

import com.boss.api.dto.ApiResultDTO;
import com.boss.asset.service.IAssetInfoService;
import com.boss.common.base.BasicinfoBaseController;
import com.boss.common.service.ICommonService;
import com.boss.salary.constant.ApiElementConstant;
import com.boss.salary.entity.AgencyVerify;
import com.boss.salary.entity.ConfigCtrl;
import com.boss.salary.service.IAgencyVerifyService;
import com.boss.sys.ca.user.dto.UserDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.ws.rs.core.MediaType;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <br>Title: 获取平台基础信息类--用于select
 * <br>Description:获取平台基础信息类
 * <br>Author:
 * <br>Date:
 */
@RestController
@RequestMapping(path = "/agencyApiController", produces = MediaType.APPLICATION_JSON)
public class AgencyApiController extends BasicinfoBaseController {

    /**
     * 引入日志框架常量
     */
    private final static Logger logger = LoggerFactory.getLogger(AgencyApiController.class);

    @Autowired
    private IAssetInfoService assetInfoService;


    @Autowired
    private ICommonService iCommonService;
    @Autowired
    private IAgencyVerifyService agencyVerifyService;
    /**
     * 获取财政区域
     * @return
     */
    @GetMapping("/getAgencyMofDiv")
    public ApiResultDTO getAgencyMofDiv(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.MOF_DIV, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getAgencyMofDiv 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取人员来源
     * @return
     */
    @GetMapping("/getAgencyPersou")
    public ApiResultDTO getAgencyPersou(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.PERSOU, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getAgencyPersou 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取人员身份
     * @return
     */
    @GetMapping("/getAgencyPeride")
    public ApiResultDTO getAgencyPeride(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.PERIDE, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getAgencyPeride 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取人员状态
     * @return
     */
    @GetMapping("/getAgencyPersta")
    public ApiResultDTO getAgencyPersta(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.PERSTA, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getAgencyPersta 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取单位类型
     * @return
     */
    @GetMapping("/getAgencyAdmdep")
    public ApiResultDTO getAgencyAdmdep(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.ADMDEP, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getAgencyAdmdep 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取单位行政级别
     * @return
     */
    @GetMapping("/getAgencyAgencyadmlevel")
    public ApiResultDTO getAgencyAgencyadmlevel(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.AGENCYADMLEVEL, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getAgencyAgencyadmlevel 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取银行代码
     * @return
     */
    @GetMapping("/getAgencyBank")
    public ApiResultDTO getAgencyBank(@RequestHeader("X-Token") String tokenid){
        try {
            UserDTO userDto = getUser(tokenid);
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.SALBANK, userDto.getProvince()));
        } catch (Exception e) {
            logger.error("调用 getAgencyBank 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取民族代码
     * @return
     */
    @GetMapping("/getNat")
    public ApiResultDTO getNat(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.NAT, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getNat 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取证件类型代码
     * @return
     */
    @GetMapping("/getCitType")
    public ApiResultDTO getCitType(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.CITTYPE, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getCitType 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取学历代码
     * @return
     */
    @GetMapping("/getSchrec")
    public ApiResultDTO getSchrec(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.SCHREC, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getSchrec 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取职务
     * @return
     */
    @GetMapping("/getPosgr")
    public ApiResultDTO getPosgr(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.POSGR, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getPosgr 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取职级
     * @return
     */
    @GetMapping("/getGr")
    public ApiResultDTO getGr(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.GR, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getGr 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取技术等级
     * @return
     */
    @GetMapping("/getTecgr")
    public ApiResultDTO getTecgr(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.TECGR, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getTecgr 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取工资级别
     * @return
     */
    @GetMapping("/getSalagr")
    public ApiResultDTO getSalagr(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.SALAGR, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getSalagr 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取性别
     * @return
     */
    @GetMapping("/getSex")
    public ApiResultDTO getSex(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect("SEX", ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getSex 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取国籍
     * @return
     */
    @GetMapping("/getCountry")
    public ApiResultDTO getCountry(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.NATIONALITY, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getCountry 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取人员经费保障方式
     * @return
     */
    @GetMapping("/getFundmode")
    public ApiResultDTO getFundmode(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.FUNDMODE, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getFundmode 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取支付方式
     * @return
     */
    @GetMapping("/getPayType")
    public ApiResultDTO getPayType(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.PAY_TYPE, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getPayType 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取项目分类
     * @return
     */
    @GetMapping("/getProCat")
    public ApiResultDTO getProCat(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.PRO_CAT, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getProCat 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取预算项目
     * @return
     */
    @GetMapping("/getPro")
    public ApiResultDTO getPro(@RequestHeader("X-Token") String tokenid){
        try {
            UserDTO userDTO = getUser(tokenid);
            return ApiResultDTO.success(assetInfoService.getProDataSelect(userDTO));
        } catch (Exception e) {
            logger.error("调用 getPro 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取部门支出经济分类
     * @return
             */
    @GetMapping("/getDepBgtEco")
    public ApiResultDTO getDepBgtEco(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataDepBgtEcoTree(ApiElementConstant.DEP_BGT_ECO, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getDepBgtEco 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取政府经济分类
     * @return
     */
    @GetMapping("/getGovBgtEcoTree")
    public ApiResultDTO getGovBgtEcoTree(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataGovBgtEcoTree(ApiElementConstant.GOV_BGT_ECO, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getGovBgtEcoTree 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }
    /**
     * 获取支出功能分类科目
     * @return
     */
    @GetMapping("/getBaseDataFunc")
    public ApiResultDTO getBaseDataFuncTree(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataFuncTree(ApiElementConstant.EXP_FUNC, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getBaseDataFuncTree 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取政府经济分类
     * @return
     */
    @GetMapping("/getGovBgtEco")
    public ApiResultDTO getGovBgtEco(){
        try {
            return ApiResultDTO.success(assetInfoService.getBaseDataSelect(ApiElementConstant.GOV_BGT_ECO, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getGovBgtEco 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取工资类别
     * @return
     */
    @GetMapping("/getPayCategory")
    public ApiResultDTO getPayCategory(){
        try {
            return ApiResultDTO.success(assetInfoService.getPayCategoryTree(ApiElementConstant.PAY_CATEGORY, ApiElementConstant.PROVINCE));
        } catch (Exception e) {
            logger.error("调用 getPayCategory 方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取单位树（带代编权限过滤）
     * @return
     */
    @GetMapping("/getAuthAgencyTree")
    public ApiResultDTO getAuthAgencyTree(@RequestHeader("X-Token") String tokenid){
        try {
            UserDTO userDTO = getUser(tokenid);
            return ApiResultDTO.success(iCommonService.getAuthAgencyTree(userDTO));
        } catch (Exception e) {
            logger.error("获取单位树方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取登录用户拥有权限中的一个机构
     * @param tokenid
     * @return
     */
    @GetMapping("/getFirstAuthAgencyData")
    public ApiResultDTO getFirstAuthAgencyData(@RequestHeader("X-Token") String tokenid){
        try {
            UserDTO userDTO = getUser(tokenid);

            Map<String, Object> tree = iCommonService.getFirstAuthAgencyData(userDTO);
            if(null == tree){
                return ApiResultDTO.error("单位树为空");
            }else{
                return ApiResultDTO.success(tree);
            }
        } catch (Exception e) {
            logger.error("获取单位树方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取单位树
     * @return
     */
    @GetMapping("/getAgencyTree")
    public ApiResultDTO getAgencyTree(@RequestHeader("X-Token") String tokenid,
                                      @RequestParam("agencyId")String agencyId){
        try {
            UserDTO userDTO = getUser(tokenid);

            return ApiResultDTO.success(iCommonService.getAgencyTree(agencyId,userDTO));
        } catch (Exception e) {
            logger.error("获取单位树方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }
    /**
     * 平台推送消息测试
     * @return
     */
    @GetMapping("/pushMessageToApaas")
    public ApiResultDTO pushMessageToApaas(@RequestHeader("X-Token") String tokenid,
                                      @RequestParam("agencyId")String agencyId){
        try {
            UserDTO userDTO = getUser(tokenid);
            iCommonService.pushMessageToApaas(userDTO,agencyId,"");
        } catch (Exception e) {
            logger.error("推送消息： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
        return ApiResultDTO.success();
    }

    /**
     * 获取工资类型
     * @return
     */
    @GetMapping("/getSalaryType")
    public ApiResultDTO getSalaryType(@RequestHeader("X-Token") String tokenid) {
        try {
            Map<String, Object> queryParam=new HashMap<>();
            UserDTO userDto = getUser(tokenid);
            queryParam.put("mof_div_code",userDto.getProvince());
            queryParam.put("type","salary_type");
            return ApiResultDTO.success(iCommonService.queryBaseDataList(queryParam));
        }catch (Exception e){
            logger.error("获取工资类型： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }

    }
    @GetMapping("/getConfigCtrlByTypeMof")
    public ApiResultDTO selectConfigCtrlByTypeMof(@RequestHeader("X-Token") String tokenid,
                                                  @RequestParam("type")String type) {
        try {
            UserDTO userDto = getUser(tokenid);
            ConfigCtrl cc=iCommonService.selectConfigCtrlByTypeMof(type,userDto.getProvince());
            Double flag;
            if(cc==null){
                flag=1.00;
            }else{
                //1做限制0不做限制
                flag=cc.getIsAble();
            }
            return ApiResultDTO.success(flag);
        }catch (Exception e){
            logger.error("获取开关限制： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }

    }

    /**
     * 获取平台单位
     * @return
     */
    @GetMapping("/getAgencyList")
    public ApiResultDTO getAgencyLnIt(@RequestHeader("X-Token") String tokenid){
        try {
            UserDTO userDTO = getUser(tokenid);
            List<Map<String, Object>> getAgencyList= iCommonService.getAgency(userDTO);
            return ApiResultDTO.success(getAgencyList,null);
        } catch (Exception e) {
            logger.error("获取单位树方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 将平台单位 插入 AgencyInfo AgencyVerify AgencyExt表中
     * @param tokenid
     * @param agencyVerifyList
     * @return
     */
    @PostMapping("/insertAgencyLnIt")
    public ApiResultDTO insertAgencyLnIt(@RequestHeader("X-Token") String tokenid,
                                         @RequestBody List<AgencyVerify> agencyVerifyList){
        try {
            UserDTO userDTO = getUser(tokenid);
            List<AgencyVerify> agencyList =agencyVerifyService.insertAgencyLnIt(userDTO,agencyVerifyList);
            return ApiResultDTO.success(agencyList,null);
        } catch (Exception e) {
            logger.error("获取单位树方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 获取未审核单位树（带代编权限过滤）
     * @return
     */
    @GetMapping("/getNotAuditAuthAgencyTree")
    public ApiResultDTO getNotAuditAuthAgencyTree(@RequestHeader("X-Token") String tokenid,@RequestParam(value = "menuid") String menuid){
        try {
            UserDTO userDTO = getUser(tokenid);
            return ApiResultDTO.success(iCommonService.getNotAuditAuthAgencyTree(userDTO,menuid));
        } catch (Exception e) {
            logger.error("获取单位树方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }

    /**
     * 人员信息维护-维护工资信息获取单位树（带代编权限过滤）
     * 过滤财务已送审
     * @return
     */
    @GetMapping("/getAuthAgencyTrees")
    public ApiResultDTO getAuthAgencyTrees(@RequestHeader("X-Token") String tokenid,@RequestParam(value = "menuid") String menuid){
        try {
            UserDTO userDTO = getUser(tokenid);
            return ApiResultDTO.success(iCommonService.getAuthAgencyTrees(userDTO,menuid));
        } catch (Exception e) {
            logger.error("获取单位树方法异常： " + e.getMessage(), e);
            return ApiResultDTO.error("199999", e.getMessage());
        }
    }


}
